#include "queue.h"

// @ 创建队列
// @ return : Queue : 新队列
Queue CreateQueue() {
    Queue que = (Queue)malloc(sizeof(QueueNode));
    que->val = QueueVal();
    que->nxt = nullptr;
    que->tail = que;
    return que;
}

// @ 入队
// @ que : Queue : 队列
// @ node : QueueVal : 入队元素
void EnQueue(Queue que, QueueVal node) {
    QueueNode *n = (QueueNode*)malloc(sizeof(QueueNode));
    n->val = node;
    n->nxt = nullptr;
    n->tail = nullptr;
    que->tail->nxt = n;
    que->tail = n;
}

// @ 出队
// @ que : Queue : 队列
// @ return : QueueNode : 队首元素
QueueVal DeQueue(Queue que) {
    QueueNode *tmp = que->nxt;
    que->nxt = que->nxt->nxt;
    if (tmp == que->tail) {
        que->tail = que;
    }
    QueueVal tmp_val = tmp->val;
    free(tmp);
    return tmp_val;
}

// @ 队列是否为空
// @ que : Queue : 队列
// @ return : bool : 队列为空为true,否则为false
bool IsQueueEmpty(Queue que) {
    return que->nxt == nullptr;
}
